КомплМатр.отд
Главная     ◄Глагол     ◄Азбука     ◄Задачи на Глаголе     Примеры приложений ►   Среда разработки ►   Отладка программ ►   Отличия от Оберона ►   Отличия от Паскаля ►   Ассемблер ARM ►   Глагол для ARM ►   ? и Ответы
 
 glagol.png Программируем по-русски
 

Основная задача Глагола — дать человеку возможность воплощать свои мысли на языке, близком к его родному языку.

Издатель Глагола
 

 

(*~\Глагол\Отделы\Числа~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
(**)                        ОТДЕЛ КомплМатр;
(*============================================================================*
 * НАЗНАЧЕНИЕ: определение матриц из комплексных чисел
 *             и основные вычисления над ними
 *
 * Источники, ссылки, библиография
Debord J., Библиотека математических подпрограмм
   tpmath.zip

Goffe B., Программа SimAnn.FOR (Simulated Annealing in Fortran)
   http://www.netlib.org/opt/simann.f

EISPACK: Библиотека Фортран функций для вычисления собственных значений и векторов
   http://www.netlib.org/eispack

Marsaglia G., Тесты для генераторов случайных чисел
   http://stat.fsu.edu/~geo/diehard.html

Moshier S., Библиотека математических подпрограмм
   http://www.moshier.net

Press W.H., Teukolsky S.A., Vetterling W.T., Flannery B.P.
   Численные рецепты на Паскале
   http://garbo.uwasa.fi/pc/turbopas.html

Пакет численных методов для Турбо Паскаля
   Borland International, 1986
 *============================================================================*)
ИСПОЛЬЗУЕТ
  Матем,
  Компл,
  Вект,
  КомплВект,
  Матр;

ВИД
  Вид-=РЯД ИЗ КомплВект.Вид;
  Доступ-=ДОСТУП К Вид;

(******************************************************************************)
ЗАДАЧА РазложитьНаLU-(A+:Вид; строки+:Матр.Перестановки):ЦЕЛ;
(* Цель:  LU-разложение (A=L*U) квадратной матрицы A на два сомножителя L и U,
 *        где L - это нижняя треугольная матрица с единичной главной диагональю,
 *          а U - верхняя треугольная матрица. Эта задача используется
 *        совместно с РешитьИзLU для решения систем уравнений.
 * До:    < A >      - исходная матрица
 * После: < A >      - содержит элементы и L, и U
 *        <строки> - вновь созданные записи о перестановках строк
 * Ответ: 0 или ВЫРОЖДЕНА *)
ПОСТ
  МАЛОЕ = 1.D-20;
ПЕР
  i,maxI,j,k,посл:ЦЕЛ;
  c,вед,t:Матем.Вещ;
  z,сумма:Компл.Вид;
  v:Вект.Доступ;
УКАЗ
  посл:=РАЗМЕР(A)-1;
  СОЗДАТЬ(v,посл+1);
  СОЗДАТЬ(строки,посл+1);

  ОТ i:=0 ДО посл ВЫП
    вед:=0;
    ОТ j:=0 ДО посл ВЫП
      c:=Компл.мод(A[i,j]);
      ЕСЛИ c > вед ТО
        вед:=c 
      КОН 
    КОН;
    ЕСЛИ вед < Матем.МАШЕПС ТО
      ВОЗВРАТ Матр.ВЫРОЖДЕНА
    КОН;
    v[i]:=1/вед
  КОН;
  ОТ j:=0 ДО посл ВЫП
    ОТ i:=0 ДО j-1 ВЫП
      сумма:=A[i,j];
      ОТ k:=0 ДО i-1 ВЫП
        Компл.умн(A[i,k],A[k,j],z);
        Компл.выч(сумма,z,сумма)
      КОН;
      A[i,j]:=сумма
    КОН;
    maxI:=0;
    вед:=0;
    ОТ i:=j ДО посл ВЫП
      сумма:=A[i,j];
      ОТ k:=0 ДО j-1 ВЫП
        Компл.умн(A[i,k],A[k,j],z);
        Компл.выч(сумма,z,сумма)
      КОН;
      A[i,j]:=сумма;
      t:=v[i]*Компл.мод(сумма);
      ЕСЛИ t > вед ТО
        вед:=t;
        maxI:=i
      КОН
    КОН;
    ЕСЛИ j # maxI ТО
      ОТ k:=0 ДО посл ВЫП
        Компл.обмен(A[maxI,k],A[j,k]) 
      КОН;
      v[maxI]:=v[j]
    КОН;
    строки[j]:=maxI;
    ЕСЛИ Компл.мод(A[j,j]) = 0 ТО
      Компл.алгВид(МАЛОЕ,МАЛОЕ,A[j,j])
    КОН;
    ЕСЛИ j # посл ТО
      ОТ i:=j+1 ДО посл ВЫП
        Компл.дел(A[i,j],A[j,j],A[i,j]) 
      КОН
    КОН
  КОН;
  ВОЗВРАТ 0
КОН РазложитьНаLU;

(******************************************************************************)
ЗАДАЧА РешитьИзLU-(A-:Вид;
                  b-:КомплВект.Вид; строки:Матр.Перестановки;
                  x+:КомплВект.Вид);
(* Цель:  решение системы уравнений после преобразования исходной матрицы
 *        с помощью РазложитьНаLU
 * До:    < A >    - матрица после РазложитьНаLU
 *        < b >    - комплексный вектор свободных членов
 *        <строки> - записи о перестановках строк из РазложитьНаLU
 * После: < x >    - комплексный вектор решения *)
ПЕР
  i,Ip,j,k,посл:ЦЕЛ;
  z,сумма:Компл.Вид;
УКАЗ
  посл:=РАЗМЕР(A)-1;
  k:=-1;
  ОТ i:=0 ДО посл ВЫП
    x[i]:=b[i]
  КОН;
  ОТ i:=0 ДО посл ВЫП
    Ip:=строки[i];
    сумма:=x[Ip];
    x[Ip]:=x[i];
    ЕСЛИ k >= 0 ТО
      ОТ j:=k ДО i-1 ВЫП
        Компл.умн(A[i,j],x[j],z);
        Компл.выч(сумма,z,сумма)
      КОН 
    ИНАЧЕ 
      ЕСЛИ Компл.мод(сумма) # 0 ТО
        k:=i 
      КОН 
    КОН;
    x[i]:=сумма
  КОН;
  ОТ i:=посл ДО 0 ПО -1 ВЫП
    сумма:=x[i];
    ЕСЛИ i < посл ТО
      ОТ j:=i+1 ДО посл ВЫП
        Компл.умн(A[i,j],x[j],z);
        Компл.выч(сумма,z,сумма)
      КОН 
    КОН;
    Компл.дел(сумма,A[i,i],x[i])
  КОН
КОН РешитьИзLU;

КОН КомплМатр.

 
 


Вопросы, замечания и предложения высылайте на atimopheyev@yahoo.com

 
Главная     ◄Глагол     ◄Азбука     ◄Задачи на Глаголе     Примеры приложений ►   Среда разработки ►   Отладка программ ►   Отличия от Оберона ►   Отличия от Паскаля ►   Ассемблер ARM ►   Глагол для ARM ►   ? и Ответы